iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0

我目前看了一下,在繁中的部分,好像沒有特別提到Mapping的翻譯,而在簡體的部分則會稱之為映射
的確有時候使用中文去稱呼一些單字可能會導致更混亂,但是我自己覺得有時候寫文章時內容太多中英文參雜時我自己看了也很頭痛XD,所以我在後面的章節盡量會以Mapping來稱呼,但是偶爾還是會使用到映射來稱呼

說了那麼多廢話,到底什麼是Mapping?

資料庫的Schema代表描述表格欄位的格式與記載表格中的關聯,而在ES中Mapping就是說明文檔可能具有的欄位、屬性,每個欄位的類型,例如:text、keyword、date等等,以及底層的Lucene是如何處理這些資料

而Mapping又分成:

類型 說明
Dynamic mapping dynamic : true或是dynamic : runtime的設定下,當你直接在索引直接添加文檔時,ES會自動幫你把文檔中的欄位設定類型,不需要自己設定
Explicit mapping 可以自己設定每個欄位的類型

Dynamic mapping我們之後再來介紹,這邊先說Explicit mapping
如果是自己要設定的話如下:

PUT /index_name
{
  "mappings": {
    "properties": {
      "欄位名稱(自取)": {
        "type":  "欄位類型"
      },
			 "另一個欄位名稱" : {
				"type":  "欄位類型"
			}
    }
  }
}

先呼叫mappings,在裡面包一層properties,接著就是輸入各個欄位,每個欄位內部再包type與實際要儲存的類型

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
官方文檔包含了所有的類型的資訊,但是這邊不會一一介紹,只會針對幾個比較常用的講解

接著就讓我們來開始介紹這個欄位的類型:

Keyword type

"type":  "keyword"
  • 對於像是ID、信箱或是一些密碼等等,這類都是固定內容不拆開來搜尋的就很適合
  • 常用於聚合、排序搜尋(aggregations, sorting)
  • 也常用於term-level queries(精確搜尋)

一般我們對於一些數字型態的欄位會下意識想使用int之類的方式去儲存,在ES中也有integer跟long等類型。但是除非你需要用到範圍搜尋(range query),不然其實很多數字編號,更常的使用情境是我要找到那一筆id是誰,因此用精確搜尋,有就是用keyword去儲存會更好

Text type

"type":  "text"
  • 在存入索引前會先通過分析器(analyzer),字串會被分割成更小的字串並組成一個array後存入索引
  • 通常一些full-text的欄位,例如描述一個商品的內容,或是文章內容等等
  • 通常用於全文搜索的對象。例如你想要找有關apple的評論,可能一個文檔的評論欄位有許多字但是其中有包含apple這個單字,就可以過建立text type的評論欄位來讓搜索能成立,因為資料儲存時會拆解成一個一個的獨立單字

至於什麼是analyzer?

分析器(Analyzer)
當text type文檔建立的同時,也會經過分析器然後才儲存進索引中。

而分析器又包含3個部分

題外話,我在這邊找不到不用br html去換行的方式,it邦過濾掉html tag有點痛苦 有知道怎麼在表格內換行的大大可以留言~感謝~

https://ithelp.ithome.com.tw/upload/images/20230909/20161866Tx2b2MIhU0.png

//這邊簡單使用一下Analyzer API
POST /_analyze
{
  "text": "He bought lots of food...",
  "analyzer": "standard"
}

// result
{
  "tokens": [
    {
      "token": "he",
      "start_offset": 0,
      "end_offset": 2,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "bought",
      "start_offset": 3,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "lots",
      "start_offset": 10,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "of",
      "start_offset": 15,
      "end_offset": 17,
      "type": "<ALPHANUM>",
      "position": 3
    },
    {
      "token": "food",
      "start_offset": 18,
      "end_offset": 22,
      "type": "<ALPHANUM>",
      "position": 4
    }
  ]
}

可以看到大寫變成小寫,空格與…經過分析器後都不見了
而這些變化會隨著你使用的Analyzer不同而有所改變

那這邊要帶出今天最重要的概念~Inverted index

剛剛上面提到分割完的這些獨立單字,就會存在Inverted index這樣的數據結構中

反向索引(inverted index)

  • 是ES一種儲存文字資訊的數據結構
  • 每個欄位都有自己的反向索引
    • 例如一個文檔有兩個欄位,但是都包含相同單字,可是會分別儲存進屬於自己欄位的反向索引中
  • 反向索引可以代表每一個分割成的單字跟文檔之間的關係
  • 除了文字本身儲存之外,也儲存其他資訊
    • 位置(offset、position)以及相關分數(之後會再說明)
    • 每個單字在文檔出現的頻率,對於相關分數也有幫助
  • 這樣的儲存方式減少訪問次數,提升查找效率

當然ES對於其他不同資料類型,像是日期與地理資訊就是存在BKD樹結構,不過這不是我們今天的重點~

今天的內容一樣很多:

  • mapping分成Dynamic mapping與Explicit mapping
  • keyword type的欄位是存那些通常不會變動的資訊
  • text type用於全文搜索,並且會先經過Analyzer過濾,轉換成獨立單字存入inverted index數據結構中

明天我們會繼續介紹不同類型的mapping~


上一篇
【Day 6】由淺入深來探討Elasticsearch - Routing
下一篇
【Day 8】由淺入深來探討Elasticsearch - Object field type
系列文
由淺入深來探討Elasticsearch,從基礎語法到底層相關原理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言